container: Split out a function
authorBenjamin Otte <otte@redhat.com>
Wed, 18 Nov 2015 00:47:16 +0000 (01:47 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 15 Dec 2015 13:41:16 +0000 (08:41 -0500)
Computing the clip for all children is something I want to do in other
places.

gtk/gtkcontainer.c
gtk/gtkcontainerprivate.h
gtk/gtkwidget.c

index 3122bd629f365c3426741690f6f3ed9a60746150..cb984318c2e20eeabf731996c7a048acb46fa284 100644 (file)
@@ -3751,6 +3751,30 @@ gtk_container_propagate_draw_internal (GtkContainer *container,
   cairo_restore (cr);
 }
 
+static void
+union_with_clip (GtkWidget *widget,
+                 gpointer   clip)
+{
+  GtkAllocation widget_clip;
+
+  if (!gtk_widget_is_visible (widget) ||
+      !_gtk_widget_get_child_visible (widget))
+    return;
+
+  gtk_widget_get_clip (widget, &widget_clip);
+
+  gdk_rectangle_union (&widget_clip, clip, clip);
+}
+
+void
+gtk_container_get_children_clip (GtkContainer  *container,
+                                 GtkAllocation *out_clip)
+{
+  memset (out_clip, 0, sizeof (GtkAllocation));
+
+  gtk_container_forall (container, union_with_clip, out_clip);
+}
+
 /**
  * gtk_container_propagate_draw:
  * @container: a #GtkContainer
index 78ee99c005ed5658528225a59630f10dcca8df35..1961444f7c959cf9e8cfd03fac880de6f85d468f 100644 (file)
@@ -42,6 +42,8 @@ void      _gtk_container_maybe_start_idle_sizer (GtkContainer *container);
 gboolean  _gtk_container_get_border_width_set   (GtkContainer *container);
 void      _gtk_container_set_border_width_set   (GtkContainer *container,
                                                  gboolean      border_width_set);
+void      gtk_container_get_children_clip       (GtkContainer  *container,
+                                                 GtkAllocation *out_clip);
 
 G_END_DECLS
 
index e8b30f077306959b8666608e3f45eb2b8eae1e34..0bf08a07ee86a7cb331362ba60090ad0519adcdd 100644 (file)
@@ -15629,21 +15629,6 @@ gtk_widget_set_clip (GtkWidget           *widget,
   priv->clip = *clip;
 }
 
-static void
-union_with_clip (GtkWidget *widget,
-                 gpointer   clip)
-{
-  GtkAllocation widget_clip;
-
-  if (!gtk_widget_is_visible (widget) ||
-      !_gtk_widget_get_child_visible (widget))
-    return;
-
-  gtk_widget_get_clip (widget, &widget_clip);
-
-  gdk_rectangle_union (&widget_clip, clip, clip);
-}
-
 /*
  * _gtk_widget_set_simple_clip:
  * @widget: a #GtkWidget
@@ -15690,19 +15675,17 @@ _gtk_widget_set_simple_clip (GtkWidget     *widget,
 
   if (GTK_IS_CONTAINER (widget))
     {
-      if (_gtk_widget_get_has_window (widget))
-        {
-          clip.x -= allocation.x;
-          clip.y -= allocation.y;
-        }
+      GdkRectangle children_clip;
 
-      gtk_container_forall (GTK_CONTAINER (widget), union_with_clip, &clip);
+      gtk_container_get_children_clip (GTK_CONTAINER (widget), &children_clip);
 
       if (_gtk_widget_get_has_window (widget))
         {
-          clip.x += allocation.x;
-          clip.y += allocation.y;
+          children_clip.x += allocation.x;
+          children_clip.y += allocation.y;
         }
+
+      gdk_rectangle_union (&children_clip, &clip, &clip);
     }
 
   gtk_widget_set_clip (widget, &clip);